Con questo articolo vorrei quindi fare luce sulle possibilità offerte da
Index Server e soprattutto come interfacciarsi a questa applicazione tramite
ASP.
La versione a cui mi riferisco in questo articolo è la versione 2.0
contenuta in Option Pack 4; insieme a NT 5 verrà distribuita la versione
3.0.
Index Server indicizza di default il contenuto di tutte le virtual directory definite in IIS e memorizza le informazioni in un oggetto chiamato Catalogo. Un catalogo incapsula tutti i dettagli necessari per indicizzare e raggiungere ogni documento (parole chiave e percorso). Il catalogo che viene creato di default si chiama "web" e include un'indicizzazione di tutte le directory virtuali contenute nel "Default web site". Nel caso si avessero più siti web all'interno della stessa macchina, è possibile creare un catalogo per ogni sito.
L'interfaccia per la gestione di Index Server è la Microsoft Management Console simile a quella normalmente utilizzata per gestire IIS.
Per creare un nuovo catalogo da MMC è sufficiente scegliere New dal menu che appare premendo il tasto destro del mouse sulla cartella "Index Server on Local Machine". Una volta creato il catalogo, è possibile impostare vare proprietà tra le quali la scelta del sito web da indicizzare ad esso associato.
Il percorso di ogni documento indicizzato memorizzato da Index Server è un percorso che parte dalla directory virtuale indicizzata, non è il percorso fisico della cartella in cui risiede il documento.
I documenti che vengono indicizzati di default sono i file HTML, tutti i documenti di testo o prodotti da applicativi MS. Le chiavi che Index Server estrapola dai file HTML sono il titolo, tutte le parole del testo ed il contenuto dei META tag. Per i documenti MS sono indicizzate anche tutte le proprietà del documento, quali l'autore, i commenti, le date di creazione e di salvataggio ecc.. Tramite Index Server è quindi possibile ricercare i documenti scritti da una persona in particolare, oppure quelli salvati in un determinato intervallo di giorni.
Per sapere come effettuare interrogazioni anche in linguaggio naturale a Index Server vi rimando alla documentazione istallata dall'Option Pack.
Lavorando con Index Server ho avuto la necessità di indicizzare dei documenti PDF ed ho incontrato diverse difficoltà che qui espongo brevemente dandone anche una rapida soluzione.
Index Server di default non indicizza i file in formato pdf, per abilitarlo a questa funzione bisogna prima di tutto cercare nel sito Adobe, nella sezione download, un filtro ISAPI Pdf IFilter ora disponibile nella versione 1.0 finale e 1.1 beta (con cui non ho ancora incontrato problemi).
Una volta istallato il filtro Pdf IFilter se tutto è andato bene, i vostri documenti pdf contenuti in virtual directory saranno indicizzati automaticamente.
Se facendo una ricerca con la form di esempio allegata a Index Server vedete che i documenti non sono stati indicizzati, dovete aprire il file di registro, cercare la chiave
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\ContentIndex
ed aggiungere il path del file Pdffilt.dll alla chiave DLLsToRegister
Per altri problemi cercate la chiave Index Server nel sito http://support.microsoft.com/
Index Server non effettua un'indicizzazione schedulata, in orari fissati, ma ha un processo demone (idemon.exe) che valuta quando ci sono abbastanza risorse disponibili per poter eseguire la scansione dei documenti.
Lo sviluppatore ASP ha a disposizione due oggetti per interagire con Index Server, Query e Utility.
L'oggetto Query è fondamentale in quanto permette di specificare la stringa di interrogazione, l'ordinamento con il quale si vogliono presentare i risultati, i tipi di informazioni da presentare.
L'oggetto Utility si affianca all'oggetto Query per esempio per restringere lo "scope" di una ricerca ad una specificata cartella e non a tutte le virtual directory indicizzate nel catalogo.
Le proprietà principali dell'oggetto Query sono:
Catalog: permette si specificare il nome del catalogo da utilizzare nella ricerca. Se non viene impostato alcun catalogo, IS considera quello di default.
Esempio: Q.Catalog = "Web"
Columns: una lista di nomi di colonne, ognuno separato da virgola, che appariranno come campi nel recordset dei risultati.
Esempio: Q.Columns = "filename, rank, vpath, doctitle"
MaxRecods: Limite massimo di record che IS restituisce nel recordset dei risultati.
Esempio: Q.MaxRecords = 200
Query: Stringa contenente le chiavi di ricerca.
Esempio: Q.Query = "#filename *.htm AND asp"
SortBy: elenco dei campi utilizzati per ordinare i record risultanti dalla ricerca. Dopo ogni nome di campo è possibile determinare il tipo di ordinamento ascendente o discendente.
Esempio: Q.SortBy = "filename, rank[d]"
I medodi prncipali dell'oggetto Query sono:
CreateRecordSet: esegue la query e crea un recordset ADO per scorrere i risultati.
Esempio: Set RS = Q.CreateRecordSet("sequential")
Reset: resetta lo stato dell'oggetto query
Esempio: Q.Reset
Dopo aver impostato le proprietà dell'oggetto Query, è necessario fare eseguire la ricerca che restituisce i dati nella forma di normalissimo RecordSet ADO definibile sequential (forward-only) o nonsequential.
Il codice da inserire in una pagina ASP di ricerca che ci restituisca il nome del file contenente una parola specificata nella stringa CompSearch, è quindi:
'si crea un'istanza della classe Query
Set Q =
Server.CreateObject("ixsso.Query")
Q.SortBy = "rank[d]"
'si fissa come criterio di ordinamento la raggiungibilità, discendente
Q.Columns = "filename, vpath, rank"
' si specificano le proprietà dei documenti che vogliamo estrarre:
' il nome del file, il suo virtual path, il tasso di raggiungibilità.
Q.Query = CompSearch
Q.MaxRecords = 100
' si definisce il numero massimo di documenti che vogliamo siano estratti
Set RS = Q.CreateRecordSet("nonsequential")
' viene effettuata la ricerca e viene creato il recordset dei
risultati
Questo è tutto quel che serve per interfacciarsi in modo "semplice" a IS, facile vero?
È possibile personalizzare la ricerca per esempio definendo un catalogo differente da quello di default e restringere lo scope di ricerca ad una particolare virtual directory (e sottocartelle); per far questo è necessario creare anche un'istanza della classe Util oltre che impostare altre proprietà dell'oggetto Query.
Il codice diviene il seguente:
Set Q = Server.CreateObject("ixsso.Query") 'si crea un'istanza della classe
Query
Set util = Server.CreateObject("ixsso.Util")'si crea un'istanza della classe
Util
Q.SortBy = "rank[d]"
'si fissa come criterio di ordinamento la raggiungibilità, discendente
Q.Columns = "filename, vpath, rank"
' si specificano le proprietà dei documenti che vogliamo estrarre:
' il nome del file, il suo virtual path, il tasso di raggiungibilità.
Q.Catalog = "CatalogoSitoASP"
Q.Query = CompSearch
Q.MaxRecords = 100 ' numero massimo di documenti che vogliamo siano
estratti
Q.Catalog = "nomeCatalogo" ' si definisce il catalogo su cui ricercare
Util.AddScopeToQuery Q, "nomeDirVirtuale", "deep"
' deep indica di ricercare anche all'interno delle sottocartelle della
virtual directory
Set RS = Q.CreateRecordSet("nonsequential")
' viene effettuata la ricerca e viene creato il recordset dei
risultati
Attenzione che non è possibile utilizzare il metodo AddScopeToQuery passando come virtual directory la root del sito.
Una volta ottenuto il recordset esso avrà come campi le proprietà definite nella proprietà Columns e si potranno visualizzare i risultato con il codice seguente:
<% If RS.Eof = False then ' sono stati trovati degli elementi
%>
<!-- mostra i risultati -->
<hr size="1">
<font face="Arial" size="1" color="#FF0000">Documenti da <%= (np
-1)*RS.PageSize+1 %> a
<% if (np * RS.PageSize) < RS.RecordCount then
response.write np * RS.PageSize
else
response.write RS.RecordCount
end if
%> su <%= RS.RecordCount %> in ordine decrescente di data.
</font>
<table width="100%">
<tr bgcolor="#000080">
<td width="30"> </td>
<td><font face="Arial" size="1"
color="#FFFFFF"><b>File</b></font></td>
<td width="22"><font face="Arial" size="1"
color="#FFFFFF"><b>Vedi</b></font></td>
</tr>
<%
'setto il NextRecordNumber
Do while (Not RS.Eof) and (NextRecordNumber <= RS.PageSize)
%>
<tr <% If nr = 0 then %>bgcolor="#E6E6E6"<% Else
%>bgcolor="#D0D0D0"<% End If %>>
<td><font face="Arial" size="1"><%= NextRecordNumber + (np-1)
* RS.PageSize %>.</font></td>
<td><font face="Arial" size="1" color="#000080"><font
color="#000000"><a onclick="blankUrl(this.href); return false;"
href="<%=RS("vpath")%>" ><%= RS("Filename")
%></a></font></td>
<td><a onclick="blankUrl(this.href); return false;"
href="<%=RS("vpath")%>" ><img src="lente.gif" width=20 height=20
alt="" border="0"></a></td>
</tr>
<%
RS.MoveNext
NextRecordNumber = NextRecordNumber +1
Loop
%>
</table>
In alternativa alla visualizzazione a singola pagina, è possibile salvare il recordset ed utilizzare le tecnice di paginazione descritte in questo articolo.